package co.gov.medellin.ssti.sub.service;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;

import javax.naming.NamingException;

import co.gov.medellin.ssti.sub.common.ConexionFactory;
import co.gov.medellin.ssti.sub.model.dao.DAOFactory;
import co.gov.medellin.ssti.sub.model.dao.IVflexDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.ValorFlexibleVO;
import co.gov.medellin.ssti.sub.model.vo.VflexVO;

public class VflexService {
	// Nombres de tipos valor flexible para findVflex(String nombreTipoVflex,
	// String codePadre)
	public static final String COMUNA = "COMUNA";
	public static final String BARRIO = "BARRIO";
	public static final String PARENTESCO = "PARENTESCO";
	public static final String ZONA = "ZONA";

	public VflexService() {
	}

	/**
	 * 
	 * @param nombreTipoVflex
	 * @return
	 * @throws DAOException
	 */
	public Collection<VflexVO> findVflex(String nombreTipoVflex)
			throws DAOException {
		IVflexDAO vFlexDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			vFlexDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE).getVflexDAO(
					con);
			return vFlexDAO.findVflex(nombreTipoVflex);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (vFlexDAO != null) {
				if (!vFlexDAO.isConnClosed()) {
					vFlexDAO.close();
				}
			}
		}
	}

	/**
	 * 
	 * @param nombreTipoVflex
	 * @param codePadre
	 * @return
	 * @throws DAOException
	 */
	public Collection<VflexVO> findVflex(String nombreTipoVflex,
			String codePadre) throws DAOException {
		IVflexDAO vFlexDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			vFlexDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE).getVflexDAO(
					con);
			return vFlexDAO.findVflex(nombreTipoVflex, codePadre);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (vFlexDAO != null) {
				if (!vFlexDAO.isConnClosed()) {
					vFlexDAO.close();
				}
			}
		}
	}

	/**
	 * Metodo que consulta los valores flexibles cuya descripcion es igual a
	 * strNombre.
	 * 
	 * @param strNombre
	 *            Descripcion
	 * @return
	 * @throws DAOException
	 */
	public Collection<VflexVO> findCodeValorFlex(String strNombre)
			throws DAOException {
		IVflexDAO vFlexDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			vFlexDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE).getVflexDAO(
					con);
			return vFlexDAO.findCodeValorFlex(strNombre);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (vFlexDAO != null) {
				if (!vFlexDAO.isConnClosed()) {
					vFlexDAO.close();
				}
			}
		}
	}

	/**
	 * 
	 * @param codeHijo
	 * @return
	 * @throws DAOException
	 */
	public Long findCodePadreByCodeHijo(Long codeHijo) throws DAOException {
		IVflexDAO vFlexDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			vFlexDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE).getVflexDAO(
					con);
			return vFlexDAO.findCodePadreByCodeHijo(codeHijo);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (vFlexDAO != null) {
				if (!vFlexDAO.isConnClosed()) {
					vFlexDAO.close();
				}
			}
		}
	}

	/**
	 * Metodo que consulta si existe un valor flexible con descripcion =
	 * strNombre y codigo_valor = strCodigo.
	 * 
	 * @param strNombre
	 *            Descripcion del valor flexible.
	 * @param strCodigo
	 *            codigo_valor del valor flexible.
	 * @return true si existe, false en caso contrario.
	 * @throws DAOException
	 */
	public boolean exists(String strNombre, String strCodigo)
			throws DAOException {
		IVflexDAO vFlexDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			vFlexDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE).getVflexDAO(
					con);
			return vFlexDAO.exists(strNombre, strCodigo);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (vFlexDAO != null) {
				if (!vFlexDAO.isConnClosed()) {
					vFlexDAO.close();
				}
			}
		}
	}

	/**
	 * 
	 * 
	 * @param tipovfl
	 * @param option
	 * @return
	 * @throws DAOException
	 */
	public Collection<ValorFlexibleVO> findDominio(String tipovfl, String option)
			throws DAOException {
		IVflexDAO vFlexDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			vFlexDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE).getVflexDAO(
					con);
			return vFlexDAO.findDominio(tipovfl, option);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (vFlexDAO != null) {
				if (!vFlexDAO.isConnClosed()) {
					vFlexDAO.close();
				}
			}
		}
	}

	/**
	 * Metodo que actualiza la vigencia del valor flexible con codigo =
	 * strCodVFL a 'S'.
	 * 
	 * @param strCodVFL
	 * @return
	 * @throws DAOException
	 */
	public int actValorFlex(String strCodVFL) throws DAOException {
		IVflexDAO vFlexDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			vFlexDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE).getVflexDAO(
					con);
			return vFlexDAO.actValorFlex(strCodVFL);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (vFlexDAO != null) {
				if (!vFlexDAO.isConnClosed()) {
					vFlexDAO.close();
				}
			}
		}
	}
}
